// 1.4 c++继承 - 多继承

/**
 * 面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征
 * c++继承
 * 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类，这使得创建和维护一个应用程序变得更容易。这样做，也达到了重用代码功能和提高执行效率的效果。
 * 
 * 当创建一个类时，您不需要重新编写新的数据成员和成员函数，只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类，新建的类称为派生类。
 * 
 * 继承代表了 is a 关系。例如，哺乳动物是动物，狗是哺乳动物，因此，狗是动物，等等。
                                animal
                                 eat()
           基类--------->        sleep()
 
                                  Dog
           派生类-------->        bark()
 
 * 代码如下:
      //  基类
      class animal{
        // eat() 函数
        // sleep() 函数
      }

      // 派生类
      class Dog : public Animal{
        // bark() 函数
      }
 * 
 * ------------------------------
 * 多继承
 * 多继承即一个子类可以有多个父类，它继承了多个父类的特性。
 * 
 * C++ 类可以从多个类继承成员，语法如下：
      
      class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
      {
          <派生类类体>
      };

 * 其中，访问修饰符继承方式是 public、protected 或 private 其中的一个，用来修饰每个基类，各个基类之间用逗号分隔，如上所示。现在让我们一起看看下面的实例：
 *
*/

#include <iostream>

class Shape
{
protected:
  int width;
  int height;

public:
  Shape(/* args */);
  ~Shape();
  void setWidth(int);
  void setHeight(int);
};

Shape::Shape(/* args */)
{
}

Shape::~Shape()
{
}

void Shape::setHeight(int h)
{
  height = h;
}

void Shape::setWidth(int w)
{
  width = w;
}

class PaintCost
{
private:
  /* data */
public:
  PaintCost(/* args */);
  ~PaintCost();
  int getCost(int);
};

PaintCost::PaintCost(/* args */)
{
}

PaintCost::~PaintCost()
{
}

int PaintCost::getCost(int a)
{
  return a * 70;
}

class Rectangle : public Shape, public PaintCost
{
private:
  /* data */
public:
  Rectangle(/* args */);
  ~Rectangle();
  int getArea(void);
};

Rectangle::Rectangle(/* args */)
{
}

Rectangle::~Rectangle()
{
}

int Rectangle::getArea(void)
{
  return height * width;
}

int main(void)
{
  Rectangle r1;
  r1.setWidth(10);
  r1.setHeight(6);

  std::cout << "r1 area : " << r1.getArea() << std::endl;
  std::cout << "r1 cost : " << r1.getCost(r1.getArea()) << std::endl;
  printf("-----------------end-----------------\n");
  // system("pause");
  return 0;
}